package code.main.modle.table
{
	import com.yy.dataStructure.HashMap;
	import com.yy.tools.arry.ArrayTools;

	/**
	 *桌子数据模型 
	 * @author YY
	 * 
	 */
	public class TableData
	{
		public static var GAME_STATE_START:int = 1;//牌局还没开始
		public static var GAME_STATE_GRAB_BANK:int = 2;//抢庄阶段
		public static var GAME_STATE_BET:int = 3;//下注阶段
		public static var GAME_STATE_SHOW_CARD:int = 4;//比牌阶段
		public static var GAME_STATE_SETTLEMENT:int = 5;//结算
		
		private var _matchList:HashMap;//在玩列表
		private var _watchList:HashMap;//旁观列表
		
		public var canBet:Boolean = false;//是否可下注
		public var currentGameState:int = 1;//当前牌局处于的状态
		public function TableData()
		{
			reset();
		}
		
		/**
		 *重设数据 
		 * 
		 */
		public function reset():void {
			_matchList = new HashMap();
			_watchList = new HashMap();
		}
		
		/**
		 *重设一把开局 
		 * 
		 */
		public function resetANewGame():void {
			var arr:Array = getMatchList();
			var i:int;
			var len:int = arr.length;
			var p:Player;
			for(i=0; i<len; i++) {
				p = arr[i];
				p.reset();
			}
		}
		
		/**
		 *添加一个在玩的玩家 
		 * 
		 */
		public function addAMatchPlayer(player:Player):void {
			_matchList.put(player.gameId, player);
		}
		/**
		 *添加一个玩家到旁观列表 
		 * @param player
		 * 
		 */
		public function addAWatchPlayer(player:Player):void {
			_watchList.put(player.gameId, player);
		}
		
		/**
		 *通过id获得一个在比赛的玩家 
		 * @return 
		 * 
		 */
		public function getMatchPlyerById(id:int):Player {
			return _matchList.getValue(id);
		}
		
		/**
		 *通过seat id 获得一个比赛玩家 
		 * @param id
		 * @return 
		 * 
		 */
		public function getMatchPlayerBySeatId(id:int):Player {
			var list:Array = _matchList.values();
			var i:int;
			var len:int = list.length;
			var player:Player;
			for(i=0; i<len; i++) {
				player = list[i];
				if(player.seatId == id) {
					return player;
				}
			}
			return null;
		}
		
		/**
		 *获得一个旁观列表的玩家 
		 * @param id
		 * @return 
		 * 
		 */
		public function getWatchPlayerById(id:int):Player {
			return _watchList.getValue(id);
		}
		
		
		/**
		 *获得比赛玩家列表 
		 * @param all 是否是所有玩家 true 所有玩家（包括等待玩家）        false 比晒中的玩家
		 * @return 
		 * 
		 */
		public function getMatchList(all:Boolean=true):Array {
			if(all) {
				return _matchList.values();
			}else {
				var arr:Array = _matchList.values();
				var i:int;
				var len:int = arr.length;
				var p:Player;
				var returnArr:Array = [];
				for(i=0; i<len; i++) {
					p = arr[i];
					if(p.isGaming) {
						returnArr.push(p);
					}
				}
				return returnArr;
			}
		}
		
		/**
		 *清除玩家在的比赛状态 是在比赛中 还是等待下一轮 
		 * @param boo
		 * 
		 */
		public function clearGamingState(boo:Boolean):void {
			var arr:Array = _matchList.values();
			ArrayTools.setArrayObjProp(arr, "isGaming",boo);
		}
		/**
		 *清除玩家庄家状态 
		 * @param boo
		 * 
		 */
		public function clearBankerState(boo:Boolean):void {
			ArrayTools.setArrayObjProp(_matchList.values(), "isBanker",boo);
		}
		
		/**
		 *获得旁观列表 
		 * @return 
		 * 
		 */
		public function getWatchList():Array {
			return _watchList.values();
		}
		
		/**
		 *从旁观列表 删除一个用户 
		 * @param id
		 * 
		 */
		public function removeAWatchPlayer(id:int):void {
			_watchList.remove(id);
		}
		/**
		 *从比晒列表删除一个用户 
		 * @param id
		 * 
		 */
		public function removeAMatchPlayer(id:int):void {
			_matchList.remove(id);
		}
		
		/**
		 *用户请求坐下 
		 * @param id
		 * @param seatId
		 * @param money
		 * 
		 */
		public function seatAPlayer(id:int, seatId:int, money:int):Player {
			var p:Player = getWatchPlayerById(id);
			removeAWatchPlayer(id);
			if(p) {
				addAMatchPlayer(p);
			}
			
			return p;
		}
		
		/**
		 *获取庄家 
		 * @return 
		 * 
		 */
		public function getBanker():Player {
			var arr:Array = _matchList.values();
			var i:int;
			var len:int = arr.length;
			var p:Player;
			for(i=0; i<len; i++) {
				p = arr[i];
				if(p.isBanker) {
					return p;
				}
			}
			return null;
		}
		
		/**
		 *除了庄家意外的玩家列表 
		 * @return 
		 * 
		 */
		public function getMatchPlayerExceptBanker():Array {
			var arr:Array = _matchList.values();
			var returnArr:Array = [];
			var i:int;
			var len:int = arr.length;
			var p:Player;
			for(i=0; i<len; i++) {
				p = arr[i];
				if(!p.isBanker && p.isGaming) {
					returnArr.push(p);
				}
			}
			returnArr.sortOn("seatId", Array.NUMERIC);
			return returnArr;
		}
	}
}